承上一篇的內容,我們這篇將會使用 Unity 的 Rigidbody 去編寫移動的程式碼。
首先我們要讓這個程式讀取到 Rigidbody 這個 Component,而要讀取 Transform 以外的 Component,我們需要利用到 GetComponent<>() 這個功能。我們先建立一個全域變數 rb,再在腳本開始時讀取它的 Rigidbody:
private Rigidbody2D rb;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
然後使用 Rigidbody 移動的關鍵是使用 AddForce() 功能,它不是直接移動人物位置,而是利用物理系統對人物施力,所以數值將會較大。另外 AddForce() 需要一個向量 Vector 而非單純數字,所以我們要乘一個 Vector2.right 進去:
private void FixedUpdate()
{
float inputDirection = Input.GetAxis("Horizontal");
rb.AddForce(inputDirection * 10f * Vector2.right);
}
但進行遊戲時,你會發現人物移動的加速度和減速度都較低,而把10f的數值直接提高又會導致移動速度過快。在這裹我提供一個參考了 Dawnosuar 教學所編寫的移動程式:
public class PlayerMovement : MonoBehaviour
{
[SerializeField] private float moveSpeed = 10f;
[SerializeField] private float velocityPower = 2f;
[SerializeField] private float acceleration = 1f;
[SerializeField] private float deceleration = 1f;
private Rigidbody2D rb;
private void Start()
{
rb = GetComponent<Rigidbody2D>();
}
private void FixedUpdate()
{
float inputDirection = Input.GetAxis("Horizontal");
// 我們首先要取得自己的目標速度,透過乘算輸入的方向軸以及用戶設定的最高速度數值,可以跟據玩家輸入去取得左右方向的最高速度或者沒有輸入時的 0。
float targetSpeed = inputDirection * moveSpeed;
// 然後透過 Rigidbody 的 velocity.x 功能,我們可以取得角色現時的速度並去計算它和玩家想移動的方向以及速度的差距。
float speedDif = targetSpeed - rb.velocity.x;
// 再透過檢查目標速度是否為零,去判斷玩家想要移動還是停止,從而決定使用獨立設定的加速率還是減速率。
float accelRate = (Mathf.Abs(targetSpeed) > 0.01f) ? acceleration : deceleration;
// 最後根據目標速度和現時速度的差距來進行施力的乘算,讓角色不會超過在我們所設計的最高速度,利用次方的數學程式去讓加速變得更靈敏,最後再加上決定方向性的正負。
float movement = Mathf.Pow(Mathf.Abs(speedDif) * accelRate, velocityPower) * Mathf.Sign(speedDif);
rb.AddForce(movement * Vector2.right);
}
}
[SerializeField] 是一個讓變數可以顯示在 Unity 中的程式碼,方便用戶在 Unity 中直接編輯。
https://www.youtube.com/watch?v=KbtcEVCM7bw